/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja4;

/**
 *
 * @param <E> 
 * @author Nery Giron, Adrian Martinez, Maria Fernanda Martinez, Darwin Rivas
 */
public class CircularList <E> extends AbstractList<E>{
    /**
     * 
     */
    protected Node<E> tail; 
    /**
     * 
     */
    protected int count;
    
    /**
     * Nombre: CircularList
     * Descipcion: constructor de la clase
     * Pre: no hay
     * Post: nueva lista circular vacia
     * No hay parametro ni valor de retorno
     */
    public CircularList()
    {
        tail = null;
        count = 0;
    }
    
   /**
     * Nombre: addFirst
     * Descripcion: agrega un objeto a la lista en la primera posicion
     * Pre: espacio disponible, value no es null
     * Post: valor agregado al inicio de la lista
     * @param value de tipo E
     * Valor de retorno: ninguno
     */
    @Override
    public void addFirst(E value)
    {
        Node<E> temp = new Node<>(value);
        if (tail == null) { // primer valor agregado
            tail = temp;
            tail.setNext(tail);
        } else { // elemento existe en la lista
            temp.setNext(tail.next());
            tail.setNext(temp);
        }
        count++;
    }

    /**
     * Nombre: size
     * Descripcion: obtiene la cantidad de elementos presentes en la lista
     * Pre: ninguno
     * Post: regresa la cantidad de elementos en la lista
     * Parametros: ninguno
     * @return valor tipo int
     */
    @Override
    public int size() {
        return count;
    }

    /**
     * Nombre: getFirst
     * Descripcion: obtiene el ultimo valor que se inserto en la lista
     * Pre: hay valor en la lista
     * Post: muestra valor al inicio de la lista
     * Parametros: ninguno
     * @return valor tipo E
     */
    @Override
    public E getFirst() {
        return tail.value();
    }

    /**
     * Nombre: clear
     * Descripcion: borra todos los elementos de la lista
     * Pre: ninguno
     * Post: lista vacia
     * Parametros: ninguno
     * Valor de retorno: ninguno
     */
    @Override
    public void clear() {
        count=0;
        tail=null;
    }

    /**
     * Nombre: removeFirst
     * Descripcion: el objeto que entro de ultimo a la lista es retirado de ella
     * Pre: hay valor en la lista
     * Post: valor removido de la lista
     * Parametros: ninguno
     * @return valor tipo E
     */
    @Override
    public E removeFirst() {
        Node<E> temp = tail;
        while(temp.next() != tail){
            temp = temp.next();
        }
        Node<E> temp2=tail;
        if(temp==tail){
            tail=null;
        } else{
            temp.setNext(tail.next());
            tail = temp;
        }
        count--;
        return temp2.value();
    }
}
